package br.com.bancodecurriculos.pessoa.fisica.negocio;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import br.com.bancodecurriculos.pessoa.comum.dao.impl.EmailDAOHelper;
import br.com.bancodecurriculos.pessoa.comum.dao.impl.EnderecoDAOHelper;
import br.com.bancodecurriculos.pessoa.comum.dao.impl.TelefoneDAOHelper;
import br.com.bancodecurriculos.pessoa.comum.dominio.Email.TipoEmail;
import br.com.bancodecurriculos.pessoa.comum.dominio.Endereco.TipoEndereco;
import br.com.bancodecurriculos.pessoa.fisica.dao.IPessoaFisicaDAO;
import br.com.bancodecurriculos.pessoa.fisica.dao.impl.PessoaFisicaDAO;
import br.com.bancodecurriculos.pessoa.fisica.dominio.PessoaFisica;
import br.com.bancodecurriculos.util.exception.RegistroExistenteException;
import br.com.bancodecurriculos.util.exception.RegistroInexistenteException;

public class PessoaFisicaServices {

	private IPessoaFisicaDAO pessoaFisicaDAO;

	private static PessoaFisicaServices instance;

	private PessoaFisicaServices() {
		this.pessoaFisicaDAO = new PessoaFisicaDAO(new EnderecoDAOHelper(),
				new TelefoneDAOHelper(), new EmailDAOHelper());
	}

	public static PessoaFisicaServices getInstance() {
		if (instance == null) {
			instance = new PessoaFisicaServices();
		}
		return instance;
	}

	public void inserirPessoaFisica(PessoaFisica pessoaFisica)
			throws ClassNotFoundException, SQLException,
			RegistroExistenteException, IOException {
		if (pessoaFisica.validarCPF()) {
			this.pessoaFisicaDAO.save(pessoaFisica);
		}
	}

	public void atualizarPessoaFisica(PessoaFisica pessoaFisica)
			throws ClassNotFoundException, SQLException,
			RegistroInexistenteException, IOException {
		if (pessoaFisica.validarCPF()) {
			this.pessoaFisicaDAO.update(pessoaFisica);
		}
	}

	public PessoaFisica getPessoaByCpf(String cpf)
			throws ClassNotFoundException, SQLException, IOException {
		return this.pessoaFisicaDAO.getByCpf(cpf);
	}

	public void remover(long id) throws ClassNotFoundException, SQLException,
			RegistroInexistenteException, IOException {
		this.pessoaFisicaDAO.delete(id);
	}

	public List<TipoEndereco> getAllTipoEnderecos()
			throws ClassNotFoundException, SQLException, IOException {
		return this.pessoaFisicaDAO.getEnderecoDAOHelper().getAllTipoEndereco();
	}

	public TipoEndereco getTipoEnderecoByNome(String nome)
			throws ClassNotFoundException, SQLException, IOException {
		return this.pessoaFisicaDAO.getEnderecoDAOHelper()
				.getTipoEnderecoByNome(nome);
	}

	public List<TipoEmail> getAllTipoEmail() throws ClassNotFoundException,
			SQLException, IOException {
		return this.pessoaFisicaDAO.getEmailDAOHelper().getAllTipoEmail();
	}

	public TipoEmail getTipoEmailByNome(String nome)
			throws ClassNotFoundException, SQLException, IOException {
		return this.pessoaFisicaDAO.getEmailDAOHelper()
				.getTipoEmailByNome(nome);
	}

}
